
package ru.spb.nicetu.altx.mnemo.utils.xmlsettings;

import java.io.InputStream;
import java.util.Collection;
import java.util.Map;

public interface ISettingsDocument {

  final String ROOT_TAG_NAME = "schema";
  final String GROUP_TAG_NAME = "group";
  final String ELEMENT_TAG_NAME = "element";

  final String NAME_ATTRIBUTE_NAME = "name";
  final String TYPE_ATTRIBUTE_NAME = "type";
  final String PROPERTY_TAG_NAME = "property";

  final String KEY_ATTRIBUTE_NAME = "key";
  final String VALUE_ATTRIBUTE_NAME = "value";



  InputStream toStream();


  /**
   * Добавляет описание группы в документ.
   *
   * @param groupId
   *          - идентификатор группы
   * @param type
   *          - тип группы
   * @param properties
   *          - мапа свойств новой группы
   * @return - true - при удачном создании группы;<br>
   *         false - если документ составлен некорректно или группа c
   *         идентификтором groupId уже существует
   */
  boolean addGroup(String groupId, String type,
      Map<String, String> properties);

  /**
   * удаляет группу с идентификтором groupId
   *
   * @param groupId
   *          - идентификтор группы
   * @return true - если после выполнения метода группа не существует в
   *         документе; <br/>
   *         false - если XML-документ составлен некорректно или группу удалить
   *         не удалось
   */
  boolean removeGroup(String groupId, String groupType);

  boolean isGroupExist(String groupId, String groupType);

  /**
   *
   * @param groupType
   *          - тип группы
   * @return коллекцию идентификаторов групп типа groupType
   */
  Collection<String> getGroups(String groupType);


  /**
   * @param groupId
   *          - идентификатор (имя) группы
   * @param key
   *          - ключ Свойства группы
   * @return значение Свойства группы по ключу (null, если свойства нет)
   */
  String getGroupProperty(String groupId, String key);

  /**
   * Сохраняет в Документе Свойство МС.
   *
   * @param groupId
   *          TODO
   * @param key
   *          - ключ Свойства МС
   * @param value
   *          - значение Свойства МС по ключу
   */
  void setGroupProperty(String groupId, String groupType, String key, String value);

  /**
   *
   * @param groupId
   *          - идентификатор группы
   * @param groupType
   *          - тип группы
   * @return список идентификаторов элементов группы <groupId, groupType>
   */
  Collection<String> getGroupElements(String groupId, String groupType);



  /**
   * Добавляет описание элемента в группу
   *
   * @param groupId
   *          - идентификатор группы
   * @param elementId
   *          - идентификатор элемента
   * @param properties
   *          - мапа свойств нового элемента
   * @return - true - при удачном создании элемента;<br>
   *         false - если документ составлен некорректно или группа c
   *         идентификтором groupId не существует, или элемента с
   *         идентификатором elementId уже существует в группе
   */
  boolean addElement(String groupId, String groupType, String elementId,
                     Map<String, String> properties);

  /**
   * удаляет элемента с идентификатором elementId из группы с идентификтором
   * groupId
   *
   * @param groupId
   *          - идентификтор группы
   * @param elementId
   *          - идентификтор элемента
   * @return true - если после выполнения метода элемента не существует в группе
   *         (удален или не было изначально) ; <br/>
   *         false - если XML-документ составлен некорректно или элемента
   *         удалить не удалось
   */
  boolean removeElement(String groupId, String groupType, String elementId);

  /**
   * @param groupId
   *          - имя(идентификатор) группы
   * @param elementId
   *          - идентификатор Параметра
   * @param key
   *          - ключ Свойства МС
   * @return значение Свойства Параметра по ключу (null, если нет свойства или
   *         параметра)
   */
  String getElementProperty(String groupId, String groupType, String elementId, String key);

  /**
   * Сохраняет в Документе Свойство элемента группы.
   *
   * @param elementId
   *          - идентификатор Параметра
   * @param key
   *          - ключ Свойства МС
   * @param value
   *          - значение Свойства Параметра по ключу
   */
  void setElementProperty(String groupId, String groupType,
                          String elementId, String key, String value);

}
